package com.zangs.emqx_expand.common.utils;

import org.springframework.util.StringUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.UUID;

public class Signature {
    public static void getSecret() {
        //生成应用id和密钥提供给第三方使用，具体生成规则自己定
        String appId = UUID.randomUUID().toString().replace("-", "").toLowerCase();
        String appSecret = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        System.out.println("appId:" + appId);
        System.out.println("appSecret:" + appSecret);
    }
    /**
     * 获取签名
     * @param secretKey 密钥
     * @param url 请求url
     * @param data 请求体json数据
     * @param timestampStr 时间戳
     * @return 签名结果
     */
    public static String signWithHmacSha1(String secretKey,String url, String data,String timestampStr) {
        String dataToSign = (StringUtils.hasText(data)) ? data : "";

        String origin =   url+ "\n" + dataToSign +"\n" + timestampStr;;

        try {
            SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            return Base64.getEncoder().encodeToString(mac.doFinal(origin.getBytes(StandardCharsets.UTF_8)));
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            return null;
        }
    }


    /**
     * 验证签名
     * @param secretKey 密钥
     * @param url 请求url，不包括ip和端口
     * @param data 请求体json数据
     * @param timestampStr 时间戳
     * @param signature 已经签名的数据
     * @return 验证结果
     */
    public static boolean verify(String secretKey,String url, String data,String timestampStr, String signature) {
        String calculatedHmac = signWithHmacSha1(secretKey,url,data,timestampStr);
        return StringUtils.hasText(calculatedHmac) && calculatedHmac.equals(signature);
    }



}
